using System;
using Csla;
using Ent.AccesoDatos;
using System.Collections.Generic;

namespace Ent.Inscripcion.Core.Administracion
{
    [Serializable]
    public class Estudiante : BusinessBase<Estudiante>
    {
        #region Business Methods

        private static PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(o => o.Id, "Name");
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<string> NombreProperty = RegisterProperty<string>(o => o.Nombre, "Name");
        public string Nombre
        {
            get { return GetProperty(NombreProperty); }
            set { SetProperty(NombreProperty, value); }
        }

        private static PropertyInfo<string> ApellidoProperty = RegisterProperty<string>(o => o.Apellido, "Name");
        public string Apellido
        {
            get { return GetProperty(ApellidoProperty); }
            set { SetProperty(ApellidoProperty, value); }
        }

        private static PropertyInfo<string> IdentificacionProperty = RegisterProperty<string>(o => o.Identificacion, "Name");
        public string Identificacion
        {
            get { return GetProperty(IdentificacionProperty); }
            set { SetProperty(IdentificacionProperty, value); }
        }

        private static PropertyInfo<string> CelularProperty = RegisterProperty<string>(o => o.Celular, "Name");
        public string Celular
        {
            get { return GetProperty(CelularProperty); }
            set { SetProperty(CelularProperty, value); }
        }

        private static PropertyInfo<string> DireccionProperty = RegisterProperty<string>(o => o.Direccion, "Name");
        public string Direccion
        {
            get { return GetProperty(DireccionProperty); }
            set { SetProperty(DireccionProperty, value); }
        }

        private static PropertyInfo<string> EmailProperty = RegisterProperty<string>(o => o.Email, "Name");
        public string Email
        {
            get { return GetProperty(EmailProperty); }
            set { SetProperty(EmailProperty, value); }
        }

        private static PropertyInfo<string> ClaveProperty = RegisterProperty<string>(o => o.Clave, "Name");
        public string Clave
        {
            get { return GetProperty(ClaveProperty); }
            set { SetProperty(ClaveProperty, value); }
        }

        private static PropertyInfo<string> TelefonoProperty = RegisterProperty<string>(o => o.Telefono, "Name");
        public string Telefono
        {
            get { return GetProperty(TelefonoProperty); }
            set { SetProperty(TelefonoProperty, value); }
        }

        private static PropertyInfo<string> PlanProperty = RegisterProperty<string>(o => o.Plan, "Name");
        public string Plan
        {
            get { return GetProperty(PlanProperty); }
            set { SetProperty(PlanProperty, value); }
        }

        private static PropertyInfo<string> PlanIdProperty = RegisterProperty<string>(o => o.PlanId, "Name");
        public string PlanId
        {
            get { return GetProperty(PlanIdProperty); }
            set { SetProperty(PlanIdProperty, value); }
        }

        private static PropertyInfo<int> ExpedienteIdProperty = RegisterProperty<int>(o => o.ExpedienteId, "Name");
        public int ExpedienteId
        {
            get { return GetProperty(ExpedienteIdProperty); }
            set { SetProperty(ExpedienteIdProperty, value); }
        }

        private static PropertyInfo<string> EstadoProperty = RegisterProperty<string>(o => o.Estado, "Name");
        public string Estado
        {
            get { return GetProperty(EstadoProperty); }
            set { SetProperty(EstadoProperty, value); }
        }

        private static PropertyInfo<DateTime> FechaProperty = RegisterProperty<DateTime>(o => o.Fecha, "Name");
        public DateTime Fecha
        {
            get { return GetProperty(FechaProperty); }
            set { SetProperty(FechaProperty, value); }
        }

        private static PropertyInfo<string> ImagenProperty = RegisterProperty<string>(o => o.Imagen, "Name");
        public string Imagen
        {
            get { return GetProperty(ImagenProperty); }
            set { SetProperty(ImagenProperty, value); }
        }
        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion
        
        #region Factory Methods

        public static Estudiante NewEstudiante()
        {
            return DataPortal.Create<Estudiante>();
        }

        public static Estudiante GetEstudiante(Guid id)
        {
            return DataPortal.Fetch<Estudiante>(id);
        }

        public static Estudiante GetEstudiante(string  identificacion)
        {
            return DataPortal.Fetch<Estudiante>(identificacion);
        }

        public static void DeleteEstudiante(Guid id)
        {
            DataPortal.Delete<Estudiante>(new SingleCriteria<Estudiante, Guid>(id));
        }

        private Estudiante()
        { LoadProperty(IdProperty, Guid.NewGuid()); }

        #endregion

        #region Data Access

        [RunLocal]
        protected override void DataPortal_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.DataPortal_Create();
        }

        private void DataPortal_Fetch(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", criteria), new Parametro("Identificacion", "")};
            var datos = accesoDatos.EjecutarReader("ConsultarEstudiante", parametros);
            if (datos.Datos.Read())
            {
                LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
                LoadProperty(IdentificacionProperty, datos.Datos.GetString(1));
                LoadProperty(NombreProperty, datos.Datos.GetString(2));
                LoadProperty(ApellidoProperty, datos.Datos.GetString(3));
                LoadProperty(EmailProperty, datos.Datos.GetString(4));
                LoadProperty(TelefonoProperty, datos.Datos.GetString(5));
                LoadProperty(DireccionProperty, datos.Datos.GetString(6));
                LoadProperty(ClaveProperty, datos.Datos.GetString(7));
                LoadProperty(EstadoProperty, datos.Datos.GetString(8));
                LoadProperty(CelularProperty, datos.Datos.GetString(9));
                LoadProperty(PlanIdProperty, datos.Datos.GetString(10));
                LoadProperty(PlanProperty, datos.Datos.GetString(11));
                LoadProperty(FechaProperty, DateTime.Parse(datos.Datos.GetString(12)));
                LoadProperty(ExpedienteIdProperty, Convert.ToInt32(datos.Datos.GetString(13)));
                LoadProperty(ImagenProperty, datos.Datos.GetString(14));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
        }

        private void DataPortal_Fetch(string criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            List<Parametro> parametros = new List<Parametro>();
            parametros.Add(new Parametro("Id", ""));
            parametros.Add(new Parametro("Identificacion", criteria));
            var datos = accesoDatos.EjecutarReader("ConsultarEstudiante", parametros);
            if (datos.Datos.Read())
            {
                LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
                LoadProperty(IdentificacionProperty, datos.Datos.GetString(1));
                LoadProperty(NombreProperty, datos.Datos.GetString(2));
                LoadProperty(ApellidoProperty, datos.Datos.GetString(3));
                LoadProperty(EmailProperty, datos.Datos.GetString(4));
                LoadProperty(TelefonoProperty, datos.Datos.GetString(5));
                LoadProperty(DireccionProperty, datos.Datos.GetString(6));
                LoadProperty(ClaveProperty, datos.Datos.GetString(7));
                LoadProperty(EstadoProperty, datos.Datos.GetString(8));
                LoadProperty(CelularProperty, datos.Datos.GetString(9));
                LoadProperty(PlanIdProperty, datos.Datos.GetString(10));
                LoadProperty(PlanProperty, datos.Datos.GetString(11));
                LoadProperty(FechaProperty, DateTime.Parse(datos.Datos.GetString(12)));
                LoadProperty(ExpedienteIdProperty,Convert.ToInt32( datos.Datos.GetString(13)));
                LoadProperty(ImagenProperty, datos.Datos.GetString(14));
            }
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            List<Parametro> parametros = new List<Parametro>();
            parametros.Add(new Parametro("Identificacion", ReadProperty(IdentificacionProperty)));
            parametros.Add(new Parametro("Nombre", ReadProperty(NombreProperty)));
            parametros.Add(new Parametro("Apellido", ReadProperty(ApellidoProperty)));
            parametros.Add(new Parametro("Mail", ReadProperty(EmailProperty)));
            parametros.Add(new Parametro("Telefono", ReadProperty(TelefonoProperty)));
            parametros.Add(new Parametro("Direccion", ReadProperty(DireccionProperty)));
            parametros.Add(new Parametro("Clave", ReadProperty(ClaveProperty)));
            parametros.Add(new Parametro("Estado", ReadProperty(EstadoProperty)));
            parametros.Add(new Parametro("Celular", ReadProperty(CelularProperty)));
            parametros.Add(new Parametro("Plan", ReadProperty(PlanProperty)));
            parametros.Add(new Parametro("PlanId", ReadProperty(PlanIdProperty)));
            parametros.Add(new Parametro("ExpedienteId", ReadProperty(ExpedienteIdProperty)));
            parametros.Add(new Parametro("Id", ReadProperty(IdProperty)));
            accesoDatos.EjecutarQuery("InsertarEstudiante", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            List<Parametro> parametros = new List<Parametro>();
            parametros.Add(new Parametro("Identificacion", ReadProperty(IdentificacionProperty)));
            parametros.Add(new Parametro("Nombre", ReadProperty(NombreProperty)));
            parametros.Add(new Parametro("Apellido", ReadProperty(ApellidoProperty)));
            parametros.Add(new Parametro("Mail", ReadProperty(EmailProperty)));
            parametros.Add(new Parametro("Telefono", ReadProperty(TelefonoProperty)));
            parametros.Add(new Parametro("Direccion", ReadProperty(DireccionProperty)));
            parametros.Add(new Parametro("Clave", ReadProperty(ClaveProperty)));
            parametros.Add(new Parametro("Estado", ReadProperty(EstadoProperty)));
            parametros.Add(new Parametro("Celular", ReadProperty(CelularProperty)));
            parametros.Add(new Parametro("Plan", ReadProperty(PlanProperty)));
            parametros.Add(new Parametro("PlanId", ReadProperty(PlanIdProperty)));
            parametros.Add(new Parametro("Imagen", ReadProperty(ImagenProperty)));
            parametros.Add(new Parametro("Id", ReadProperty(IdProperty)));

            accesoDatos.EjecutarQuery("ActualizarEstudiante", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            DataPortal_Delete(new SingleCriteria<Estudiante, Guid>(ReadProperty(IdProperty)));
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(SingleCriteria<Estudiante, Guid> criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            List<Parametro> parametros = new List<Parametro>();
            parametros.Add(new Parametro("Id", ReadProperty(IdProperty)));
            accesoDatos.EjecutarQuery("EliminarEstudiante", parametros);
        }

        #endregion
    }
}
